 /*******************************************************************************
  * Copyright (c) 2003, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.osgi.service.resolver;

 /**
  * BundleDeltas represent the changes related to an individual bundle between two
  * states.
  * <p>
  * Clients may implement this interface.
  * </p>
  * @since 3.1
  */
 public interface BundleDelta extends Comparable {

     /**
      * Delta type constant (bit mask) indicating that the bundle has been added
      * to the new state.
      * @see BundleDelta#getType
      */
     public static final int ADDED = 0x1;
     /**
      * Delta type constant (bit mask) indicating that the bundle is no longer present in
      * the new state.
      * @see BundleDelta#getType
      */
     public static final int REMOVED = 0x2;
     /**
      * Delta type constant (bit mask) indicating that the bundle has been updated
      * between the old and new state. Note that an update delta may in fact represent
      * a downgrading of the bundle to a previous version.
      * @see BundleDelta#getType
      */
     public static final int UPDATED = 0x4;
     /**
      * Delta type constant (bit mask) indicating that the bundle has become resolved
      * in the new state.
      * @see BundleDelta#getType
      */
     public static final int RESOLVED = 0x8;
     /**
      * Delta type constant (bit mask) indicating that the bundle has become unresolved
      * in the new state. Note that newly added bundles are unresolved by default and
      * as such, do not transition to unresolved state so this flag is not set.
      * @see BundleDelta#getType
      */
     public static final int UNRESOLVED = 0x10;
     /**
      * Delta type constant (bit mask) indicating that the bundles and packages which this
      * bundle requires/imports (respectively) have changed in the new state.
      * @see BundleDelta#getType
      * @deprecated this type is no longer valid
      */
     public static final int LINKAGE_CHANGED = 0x20;

     /**
      * Delta type constant (bit mask) indicating that the bundles which this
      * bundle optionally requires have changed in the new state.
      * @see BundleDelta#getType
      * @deprecated this type is no longer valid
      */
     public static final int OPTIONAL_LINKAGE_CHANGED = 0x40;

     /**
      * Delta type constant (bit mask) indicating that the this bundle is
      * pending a removal. Note that bundles with this flag set will also
      * have the {@link BundleDelta#REMOVED} flag set. A bundle will have
      * this flag set if it has been removed from the state but has other
      * existing bundles in the state that depend on it.
      * @see BundleDelta#getType
      */
     public static final int REMOVAL_PENDING = 0x80;

     /**
      * Delta type constant (bit mask) indicating that the this bundle has
      * completed a pending removal. A bundle will complete a pending removal only
      * after it has been re-resolved by the resolver.
      */
     public static final int REMOVAL_COMPLETE = 0x100;

     /**
      * Returns the BundleDescription that this bundle delta is for.
      * @return the BundleDescription that this bundle delta is for.
      */
     public BundleDescription getBundle();

     /**
      * Returns the type of change which occured. The return value is composed
      * of by bit-wise masking the relevant flags from the set ADDED, REMOVED,
      * UPDATED, RESOLVED, UNRESOLVED, LINKAGE_CHANGED, REMOVAL_PENDING, REMOVAL_COMPLETE.
      * Note that bundle start and stop state changes are not captured in the
      * delta as they do not represent structural changes but rather transient
      * runtime states.
      * @return the type of change which occured
      */
     public int getType();

     /**
      * Answers an integer indicating the relative positions of the receiver and
      * the argument in the natural order of elements of the receiver's class.
      * <p>
      * The natural order of elements is determined by the bundle id of the
      * BundleDescription that this bundle delta is for.
      *
      * @return int which should be <0 if the receiver should sort before the
      * argument, 0 if the receiver should sort in the same position as
      * the argument, and >0 if the receiver should sort after the
      * argument.
      * @param obj
      * another BundleDelta an object to compare the receiver to
      * @exception ClassCastException
      * if the argument can not be converted into something
      * comparable with the receiver.
      */
     public int compareTo(Object obj);
 }

